<blockquote>
    <p>Ehcache插件 @EnableEhcachePlugin 缓存注解, 默认使用缺省配置, 配置后可以注入</p>
    <footer>
        <p>@EnableEhcachePlugin 该注解默认会加载resources目录下面的<code>ehcache.xml</code>文件</p>
        <p><code>String value</code>: 指定配置文件, 例如 @EnableEhcachePlugin("ehcache.xml")</p>
    </footer>
</blockquote>
<blockquote>
    <p>使用Ehcache时需要加入Maven依赖</p>
</blockquote>
<pre class="code brush:xml">
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.6</version>
</dependency>
</pre>
<blockquote>
    <p>Ehcache配置文件 <code>ehcache.xml</code></p>
</blockquote>
<pre class="code brush:xml">
&lt?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">


    <diskStore path="java.io.tmpdir"/>

        <!-- 默认缓存 -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            memoryStoreEvictionPolicy="LRU"/>

        <!-- api接口持久化存储很少修改 -->
    <cache name="apiCache"
           maxElementsInMemory="10000"
           eternal="false"
           timeToIdleSeconds="60000"
           timeToLiveSeconds="6000"
           overflowToDisk="true"
           memoryStoreEvictionPolicy="LRU"/>

        <!--
           name:缓存名称。
           maxElementsInMemory:缓存最大数目
           maxElementsOnDisk：硬盘最大缓存个数。
           eternal:对象是否永久有效，一但设置了，timeout将不起作用。
           overflowToDisk:是否保存到磁盘，当系统当机时
           timeToIdleSeconds:设置对象在失效前的允许闲置时间（单位：秒）。仅当eternal=false对象不是永久有效时使用，可选属性，默认值是0，也就是可闲置时间无穷大。
           timeToLiveSeconds:设置对象在失效前允许存活时间（单位：秒）。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用，默认是0.，也就是对象存活时间无穷大。
           diskPersistent：是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
           diskSpoolBufferSizeMB：这个参数设置DiskStore（磁盘缓存）的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
           diskExpiryThreadIntervalSeconds：磁盘失效线程运行时间间隔，默认是120秒。
           memoryStoreEvictionPolicy：当达到maxElementsInMemory限制时，Ehcache将会根据指定的策略去清理内存。默认策略是LRU（最近最少使用）。你可以设置为FIFO（先进先出）或是LFU（较少使用）。
            clearOnFlush：内存数量最大时是否清除。
             memoryStoreEvictionPolicy:可选策略有：LRU（最近最少使用，默认策略）、FIFO（先进先出）、LFU（最少访问次数）。
                FIFO，first in first out，这个是大家最熟的，先进先出。
                LFU， Less Frequently Used，就是上面例子中使用的策略，直白一点就是讲一直以来最少被使用的。如上面所讲，缓存的元素有一个hit属性，hit值最小的将会被清出缓存。
                LRU，Least Recently Used，最近最少使用的，缓存的元素有一个时间戳，当缓存容量满了，而又需要腾出地方来缓存新的元素的时候，那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
        -->

</ehcache>
</pre>
<blockquote>
    <p>通过注入获取EhCacheTpl对象</p>
    <footer style="color:red;">注意需要在启动类指定 @EnableEhcachePlugin配置</footer>
</blockquote>
<pre class="code brush:java">
package cn.jants.demos;


import cn.jants.common.annotation.action.Controller;
import cn.jants.common.annotation.action.GET;
import cn.jants.common.annotation.boot.PropertyConfiguration;
import cn.jants.common.annotation.plugin.EnableEhcachePlugin;
import cn.jants.common.annotation.service.Application;
import cn.jants.common.annotation.service.Autowired;
import cn.jants.core.context.AppConfiguration;
import cn.jants.core.startup.JTomcat;
import cn.jants.plugin.cache.EhCacheTpl;
import cn.jants.restful.render.Json;

import java.util.Map;

/**
 * Tomcat 方式启动
 *
 * @author MrShun
 * @version 1.0
 * @Date 2017/12/20
 */
@Application
@PropertyConfiguration
@EnableEhcachePlugin
@Controller
public class DemosApplication extends AppConfiguration {

    @Autowired
    private EhCacheTpl ehCacheTpl;

    /**
     * 测试存入Key
     */
    @GET("/ehcache/set")
    public void set(){
        ehCacheTpl.put("ehcache", "测试添加缓存 ...");
    }

    /**
     * 测试根据Key取值
     */
    @GET("/ehcache/get")
    public Map get(){
        Object ehcache = ehCacheTpl.get("ehcache");
        return Json.success(ehcache);
    }

    public static void main(String[] args) {
        JTomcat.run(DemosApplication.class, 80);
    }
}
</pre>
<blockquote>
    <p>通过工具类直接EhCacheTpl对象</p>
    <footer style="color:red;">启动类不需要配置 @EnableEhcachePlugin 注解</footer>
</blockquote>
<pre class="code brush:java">
package cn.jants.demos;


import cn.jants.common.annotation.action.Controller;
import cn.jants.common.annotation.action.GET;
import cn.jants.common.annotation.boot.PropertyConfiguration;
import cn.jants.common.annotation.plugin.EnableEhcachePlugin;
import cn.jants.common.annotation.plugin.EnableRedisPlugin;
import cn.jants.common.annotation.plugin.EnableSQLMapPlugin;
import cn.jants.common.annotation.service.Application;
import cn.jants.core.context.AppConfiguration;
import cn.jants.core.startup.JTomcat;
import cn.jants.plugin.tool.EhCacheTool;
import cn.jants.restful.render.Json;

import java.util.Map;


/**
 * Tomcat 方式启动
 *
 * @author MrShun
 * @version 1.0
 * @Date 2017/12/20
 */
@Application
@Controller
public class DemosApplication extends AppConfiguration {

    @GET("/ehcache/set")
    public void set(){
        EhCacheTool.getEhCache().put("ehcache", "测试采用工具类添加缓存...");
    }

    @GET("/ehcache/get")
    public Map get(){
        Object value = EhCacheTool.getEhCache().get("ehcache");
        return Json.success(value);
    }

    public static void main(String[] args) {
        JTomcat.run(DemosApplication.class, 80, "/demo");
    }
}
</pre>
<blockquote>
    <p>注解式Ehcache缓存</p>
    <footer>可以缓存一个方法的结果, 提高效率</footer>
</blockquote>
<pre class="code brush:java">
package cn.jants.demos.controller;

import cn.jants.common.annotation.action.Controller;
import cn.jants.common.annotation.action.GET;
import cn.jants.common.annotation.action.POST;
import cn.jants.common.annotation.action.Param;
import cn.jants.common.annotation.service.Autowired;
import cn.jants.demos.entity.User;
import cn.jants.plugin.cache.CacheEvict;
import cn.jants.plugin.cache.CachePut;
import cn.jants.plugin.cache.Cacheable;
import cn.jants.plugin.cache.EhCacheTpl;
import com.alibaba.fastjson.JSON;

/**
 * Ehcache Demo
 * 需要在启动类配置@EnableEhcachePlugin注解
 * @author MrShun
 * @version 1.0
 * @Date 2017/12/21
 */
@Controller("/ehcache")
public class EhcacheDemoController {


    @Autowired
    private EhCacheTpl tpl;

    /**
     * 保存缓存
     *
     * @return
     */
    @GET("/save")
    public Object save() {
        tpl.put("app", "ants is ok!");
        return "ants ehcache save is ok!";
    }

    /**
     * 查询缓存
     *
     * @return
     */
    @GET("/get")
    public Object get() {
        System.out.println(tpl.get("app"));
        return "ants ehcache get is ok!";
    }

    /**
     * 清除默认缓存组所有key
     *
     * @return
     */
    @GET("/clear")
    public Object clear() {
        tpl.getCache().removeAll();
        return "ants ehcache clear is ok!";
    }

    /**
     * 查询ehcache默认缓存组所有key
     *
     * @return
     */
    @GET("/keys")
    public Object keys() {
        System.out.println(JSON.toJSONString(tpl.getKeys()));
        return "ants ehcache keys is ok!";
    }

    /**
     * 注解式存储缓存details固定常量,id变量值
     *
     * @return
     */
    @GET("/cacheable")
    @Cacheable(key = "details#id")
    public Object cache(@Param String id) {
        System.out.println("测试看看是否被缓存了");
        return "ants ehcache cache is ok!";
    }
    /**
     * 只更新id变量值的缓存
     *
     * @return
     */
    @POST("/put")
    @CachePut(key = "details#user.id")
    public Object put(User user) {
        return "ants ehcache put is ok!";
    }

    /**
     * 注解式清除缓存，清除所有
     *
     * @return
     */
    @GET("/evict")
    @CacheEvict
    public Object evict() {
        return "ants ehcache evict is ok!";
    }
}

</pre>
<script type="text/javascript">
    $(function () {
        SyntaxHighlighter.highlight();
        $(".toolbar").remove();
    });
</script>